package com.example.gulimall.auth.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.example.common.utils.HttpUtils;
import com.example.common.utils.R;
import com.example.gulimall.auth.feign.MemberFeignService;
import com.example.common.vo.MemberRespVo;
import com.example.gulimall.auth.vo.SocialUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpSession;
import java.util.HashMap;

@Slf4j
@Controller
public class OAuth2Controller {
    @Autowired
    MemberFeignService memberFeignService;
    @Value("${client_id}")
    private  String client_id;
    @Value("${grant_type}")
    private  String grant_type;
    @Value("${redirect_uri}")
    private  String redirect_uri;
    @Value("${client_secret}")
    private  String client_secret;
    @Value("${geteehost}")
    private  String geteehost;
    @GetMapping("oauth2/getee/success")
    public String getee(@RequestParam("code") String code, HttpSession session) throws Exception {
        // 1 根据code换取access_token
        HashMap<String, String> map = new HashMap<>();
//        map.put("client_id","b7e1410efdd940621b89947b245071a05e6172b0845e51274e8164bb5aa3ac0b");
//        map.put("grant_type","authorization_code");
//        map.put("code",code);
//        map.put("redirect_uri","http://auth.mall.com/oauth2/getee/success");
//        map.put("client_secret","bdbc40c0cd152847a412668991ca6a688f7e8ac3e058941d956c6f7dc80d1420");
        map.put("client_id",client_id);
        map.put("grant_type",grant_type);
        map.put("code",code);
        map.put("redirect_uri",redirect_uri);
        map.put("client_secret",client_secret);
        HttpResponse response = HttpUtils.doPost(geteehost, "/oauth/token", "post", new HashMap<>(), map,new HashMap<>());
        //2 登录成功跳回首页
        if (response.getStatusLine().getStatusCode()==200){
            String json = EntityUtils.toString(response.getEntity());
            SocialUser socialUser = JSON.parseObject(json, SocialUser.class);
            //更新自己系统的账号，如果社交账号第一次登录，帮他注册到我们自己的系统，如果不是第一次更新当前用户的一些信息
            R oauthLogin = memberFeignService.oauthLogin(socialUser);
            if(oauthLogin.getCode()==0){
                MemberRespVo data = oauthLogin.getData("data", new TypeReference<MemberRespVo>(){});

                log.info("登录成功，用户信息："+data);
                //1 第一次使用session:命令浏览器保存卡号
                //2 以后浏览器访问哪个网站就会带上这个网站的cookie
                //3 子域之间，mall.com auth.mall.com order,mall.com
                // 4 发卡的时候（指定域名，位父域名），即使是子域系统发的卡，也能让父域直接使用
                // TODO 1 默认发的令牌， 作用域为当前域（解决子域session共享问题）
                // TODO 2 使用json序列化方式来序列化对象数据到redis
                session.setAttribute("loginUser",data);
                return  "redirect:http://mall.com/";
            }else {
                return  "redirect:http://auth.mall.com/";
            }
            // 知道是哪个用户
                //1 如果用户是第一次进入我们的网站自动注册（为当前社交用户自动注册，以后这个社交用户关联一个账号）


        }else {
            return  "redirect:http://auth.mall.com/";
        }

    }
}
